/*
 * Empresa.java
 *
 * Created on 16 de Maio de 2007, 16:03
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package pt.iscte.dcti.es.rhplus.sistema;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Hashtable;
import java.util.LinkedList;

import pt.iscte.dcti.es.rhplus.sistema.persistencia.AcessoBD;

/**
 * 
 * @author Gustavo Cabral
 * @author Helena Monteiro
 * @author Joao Catarino
 * @author Tiago Moreiras
 */
public class Empresa {

	/** Creates a new instance of Empresa */
	public Empresa(final int id_empresa, final int numero_de_empresa, final String designacao, final int nif, final int nib, final String email,
			final int telefone, final int telemovel, final String morada, final CodigoPostal codigo_postal) {

		this.id_empresa = id_empresa;
		this.numero_de_empresa = numero_de_empresa;
		this.designacao = designacao;
		this.nif = nif;
		this.nib = nib;
		this.email = email;
		this.telefone = telefone;
		this.telemovel = telemovel;
		this.morada = morada;
		this.codigo_postal = codigo_postal;
	}

	public int getIdEmpresa() {
		return id_empresa;
	}

	public int getNumeroDeEmpresa() {
		return numero_de_empresa;
	}

	public void setNumeroDeEmpresa(final int numero_de_empresa) {
		this.numero_de_empresa = numero_de_empresa;
	}

	public String getDesignacao() {
		return designacao;
	}

	public void setDesignacao(final String designacao) {
		this.designacao = designacao;
	}

	public int getNIF() {
		return nif;
	}

	public void setNIF(final int nif) {
		this.nif = nif;
	}

	public int getNIB() {
		return nib;
	}

	public void setNIB(final int nib) {
		this.nib = nib;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(final String email) {
		this.email = email;
	}

	public int getTelefone() {
		return telefone;
	}

	public void setTelefone(final int telefone) {
		this.telefone = telefone;
	}

	public int getTelemovel() {
		return telemovel;
	}

	public void setTelemovel(final int telemovel) {
		this.telemovel = telemovel;
	}

	public String getMorada() {
		return morada;
	}

	public void setMorada(final String morada) {
		this.morada = morada;
	}

	public CodigoPostal getCodigoPostal() {
		return codigo_postal;
	}

	public void setCodigoPostal(final CodigoPostal codigo_postal) {
		this.codigo_postal = codigo_postal;
	}

	public static Empresa devolve(final int id_empresa) throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
		// Consulta a BD
		AcessoBD acesso_bd = new AcessoBD();
		acesso_bd.carregaDriverEAbreLigacao();
		String qryName = new String("visualizar_empresa");
		Hashtable<String, Object> dados_da_empresa = new Hashtable<String, Object>();
		dados_da_empresa.put("var_id_empresa", id_empresa);
		ResultSet result_set = acesso_bd.executaSelect(qryName, dados_da_empresa);

		result_set.next();

		int var_id_codigo_postal = result_set.getInt("id_codigo_postal");

		// Criar a Empresa
		int var_id_empresa = result_set.getInt("id_empresa");
		int var_numero_de_empresa = result_set.getInt("numero_de_empresa");
		String var_designacao = result_set.getString("designacao");
		int var_nif = result_set.getInt("nif");
		int var_nib = result_set.getInt("nib");
		String var_email = result_set.getString("email");
		int var_telefone = result_set.getInt("telefone");
		int var_telemovel = result_set.getInt("telemovel");
		String var_morada = result_set.getString("morada");

		acesso_bd.fechaLigacao();

		CodigoPostal var_codigo_postal = CodigoPostal.devolve(var_id_codigo_postal);

		Empresa empresa = new Empresa(var_id_empresa, var_numero_de_empresa, var_designacao, var_nif, var_nib, var_email, var_telefone,
				var_telemovel, var_morada, var_codigo_postal);

		return empresa;
	}

	public static LinkedList<Empresa> devolveTodas() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
		// Consulta a BD
		AcessoBD acesso_bd = new AcessoBD();
		acesso_bd.carregaDriverEAbreLigacao();
		String qryName = new String("visualizar_empresas");
		ResultSet result_set = acesso_bd.executaSelect(qryName, null);

		// Criar a lista de empresas
		LinkedList<Empresa> lista_de_empresas = new LinkedList<Empresa>();

		while (result_set.next()) {

			int var_id_codigo_postal = result_set.getInt("id_codigo_postal");

			// Criar a Empresa
			int var_id_empresa = result_set.getInt("id_empresa");
			int var_numero_de_empresa = result_set.getInt("numero_de_empresa");
			String var_designacao = result_set.getString("designacao");
			int var_nif = result_set.getInt("nif");
			int var_nib = result_set.getInt("nib");
			String var_email = result_set.getString("email");
			int var_telefone = result_set.getInt("telefone");
			int var_telemovel = result_set.getInt("telemovel");
			String var_morada = result_set.getString("morada");

			

			CodigoPostal var_codigo_postal = CodigoPostal.devolve(var_id_codigo_postal);

			Empresa empresa = new Empresa(var_id_empresa, var_numero_de_empresa, var_designacao, var_nif, var_nib, var_email, var_telefone,
					var_telemovel, var_morada, var_codigo_postal);

			lista_de_empresas.add(empresa);
		}
		
		acesso_bd.fechaLigacao();

		return lista_de_empresas;
	}

	public static void insere(final Hashtable<String, Object> dados_da_empresa) throws SQLException, ClassNotFoundException, InstantiationException,
			IllegalAccessException {
		
		// Inserir na base de dados - Empresa
		int ultimo_id_inserido = Empresa.devolveUltimoIdentificadorDeInsercao();

		AcessoBD acesso_bd = new AcessoBD();
		acesso_bd.carregaDriverEAbreLigacao();
		String qryName = new String("inserir_empresa");
		dados_da_empresa.put("var_id_empresa", new Integer(ultimo_id_inserido));
		acesso_bd.executaUpdate(qryName, dados_da_empresa);
		acesso_bd.fechaLigacao();

	}

	public static void altera(final Hashtable<String, Object> dados_da_empresa) throws SQLException, ClassNotFoundException, InstantiationException,
			IllegalAccessException {

		AcessoBD acesso_bd = new AcessoBD();
		acesso_bd.carregaDriverEAbreLigacao();
		String qryName = new String("alterar_empresa");
		acesso_bd.executaUpdate(qryName, dados_da_empresa);
		acesso_bd.fechaLigacao();

	}

	public static void remove(final int id_empresa) throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
		AcessoBD acesso_bd = new AcessoBD();
		acesso_bd.carregaDriverEAbreLigacao();
		String qryName = new String("remover_empresa");
		Hashtable<String, Object> dados_da_empresa = new Hashtable<String, Object>();
		dados_da_empresa.put("var_id_empresa", new Integer(id_empresa));

		acesso_bd.executaUpdate(qryName, dados_da_empresa);
		acesso_bd.fechaLigacao();
		
	}

	public static int devolveUltimoIdentificadorDeInsercao() throws SQLException, ClassNotFoundException, InstantiationException,
			IllegalAccessException {
		AcessoBD acesso_bd = new AcessoBD();
		acesso_bd.carregaDriverEAbreLigacao();
		String qryName = new String("devolver_ultimo_id_de_empresa");
		ResultSet result_set = acesso_bd.executaSelect(qryName, null);
		result_set.next();
		int ultimo_id_empresa = result_set.getInt("ultimo_id");
		acesso_bd.fechaLigacao();
		return ultimo_id_empresa;
	}

	public Hashtable<String, Object> toHashtable() {
		Hashtable<String, Object> dados_da_empresa = new Hashtable<String, Object>();

		dados_da_empresa.put("var_id_empresa", new Integer(this.getIdEmpresa()));
		dados_da_empresa.put("var_numero_de_empresa", new Integer(this.getNumeroDeEmpresa()));
		dados_da_empresa.put("var_designacao", this.getDesignacao());
		dados_da_empresa.put("var_nif", this.getNIF());
		dados_da_empresa.put("var_nib", this.getNIB());
		dados_da_empresa.put("var_email", this.getEmail());
		dados_da_empresa.put("var_telefone", new Integer(this.getTelefone()));
		dados_da_empresa.put("var_telemovel", new Integer(this.getTelemovel()));
		dados_da_empresa.put("var_morada", this.getMorada());
		dados_da_empresa.put("var_id_codigo_postal", this.getCodigoPostal().getIdCodigoPostal());

		return dados_da_empresa;
	}

	public void gravaParaBaseDeDados() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {

		Empresa.altera(this.toHashtable());

		/**
		 * Empresa.altera(this.getIdEmpresa(), this.getNumeroDeEmpresa(),
		 * this.getDesignacao(), this.getNIF(), this.getNIB(), this.getEmail(),
		 * this .getTelefone(), this.getTelemovel(), this.getMorada(),
		 * this.getCodigoPostal());
		 */
	}

	public String toString() {
		return id_empresa + ";" + numero_de_empresa + ";" + designacao + ";" + nif + ";" + nib + ";" + nif + ";" + email + ";" + telefone + ";"
				+ telemovel + ";" + morada + ";" + codigo_postal + ";";
	}

	// Atributos
	private int id_empresa;

	private int numero_de_empresa;

	private String designacao;

	private int nif;

	private int nib;

	private String email;

	private int telefone;

	private int telemovel;

	private String morada;

	private CodigoPostal codigo_postal;

}
